//package com.czy.kettle;
//
//import com.sinitek.sinicube.etl.database.dto.DatabaseTypeDTO;
//import lombok.SneakyThrows;
//import lombok.extern.slf4j.Slf4j;
//import org.pentaho.di.core.database.DatabaseInterface;
//import org.pentaho.di.core.exception.KettleException;
//import org.pentaho.di.core.logging.LogChannel;
//import org.pentaho.di.core.plugins.DatabasePluginType;
//import org.pentaho.di.core.plugins.PluginInterface;
//import org.pentaho.di.core.plugins.PluginRegistry;
//import org.pentaho.di.core.plugins.PluginTypeListener;
//
//import java.util.*;
//
///**
// * 系统支持的数据库类型管理
// *
// * @author 陈智勇
// * date 2023-12-07
// */
//public class DatabaseTypeRunner implements PluginTypeListener {
//
//	private static final DatabaseTypeRunner instance = new DatabaseTypeRunner();
//
//	public SortedMap<String, DatabaseInterface> connectionMap = new TreeMap<>();
//	public Map<String, String> connectionNametoID = new HashMap<>();
//
//	@SneakyThrows
//	private DatabaseTypeRunner() {
//		List<String> SUPPORT_DATABASE_TYPE_LIST = Arrays.asList("GENERIC DATABASE", "ORACLE", "MYSQL","POSTGRESQL");
//
////		DatabasePluginType databasePluginType = DatabasePluginType.getInstance();
////		databasePluginType.registerCustom(Hive2DatabaseMeta.class, "", DataBaseTypeEnum.HIVE2.getCode(), DataBaseTypeEnum.HIVE2.getCode(), "", "");
//
//		PluginRegistry registry = PluginRegistry.getInstance();
//		List<PluginInterface> plugins = registry.getPlugins(DatabasePluginType.class);
//
//		log.info("总的识别数据库支持: {}", plugins.size());
//		Iterator<PluginInterface> iterator = plugins.iterator();
//		while (iterator.hasNext()) {
//			PluginInterface plugin = iterator.next();
//			String name = plugin.getName();
//			log.info("当前数据库的name: {}", name);
////			if (!SUPPORT_DATABASE_TYPE_LIST.contains(name.toUpperCase())) {
////				registry.removePlugin(DatabasePluginType.class, plugin);
////				iterator.remove();
////			}
//		}
//
//		registry.addPluginListener(DatabasePluginType.class, this);
//		for (PluginInterface plugin : plugins) {
//			this.pluginAdded(plugin);
//		}
//	}
//
//	public static DatabaseTypeRunner instance() {
//		return instance;
//	}
//
//	public List<DatabaseTypeDTO> loadSupportedDatabaseTypes() {
//		List<DatabaseTypeDTO> list = new ArrayList<>();
//
//		for ( String value : connectionMap.keySet() ) {
//			DatabaseTypeDTO dto = new DatabaseTypeDTO();
//			dto.setValue(connectionNametoID.get(value));
//			dto.setText(value);
//	    	list.add(dto);
//	    }
//		return list;
//	}
//
//	@Override
//	public void pluginAdded(Object serviceObject) {
//		PluginInterface plugin = (PluginInterface) serviceObject;
//		String pluginName = plugin.getName();
//		try {
//			DatabaseInterface databaseInterface = (DatabaseInterface) PluginRegistry.getInstance().loadClass(plugin);
//			databaseInterface.setPluginId(plugin.getIds()[0]);
//			databaseInterface.setName(pluginName);
//
//			connectionMap.put(pluginName, databaseInterface);
//			connectionNametoID.put(pluginName, databaseInterface.getPluginId());
//		} catch (KettleException e) {
//			String message = "Could not create connection entry for " + pluginName + ".  " + e.getCause().getClass().getName();
//			log.error("pluginName: [{}]添加时发生异常", pluginName,e);
//			LogChannel.GENERAL.logError(message);
//		}
//	}
//
//	@Override
//	public void pluginChanged(Object serviceObject) {
//		PluginInterface plugin = (PluginInterface) serviceObject;
//		String pluginName = plugin.getName();
//
//		connectionMap.remove(pluginName);
//		connectionNametoID.remove(pluginName);
//	}
//
//	@Override
//	public void pluginRemoved(Object serviceObject) {
//		pluginRemoved(serviceObject);
//		pluginAdded(serviceObject);
//	}
//
//
//}
